From c32f3b529cfd1d472407f9e04f999ad8b910cf15 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Tue, 21 Feb 2006 18:21:13 +0100 Subject: [PATCH] Fix cleanup path if an HVM guest fails very early, before direct map is built. Signed-off-by: Xin Li --- xen/arch/x86/shadow32.c | 20 ++++++++++++++------ xen/arch/x86/shadow_public.c | 20 ++++++++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/xen/arch/x86/shadow32.c b/xen/arch/x86/shadow32.c index fe58ed9453..5264b0359b 100644 --- a/xen/arch/x86/shadow32.c +++ b/xen/arch/x86/shadow32.c @@ -1110,22 +1110,30 @@ fail: void shadow_direct_map_clean(struct vcpu *v) { int i; + unsigned long mfn; + struct domain *d = v->domain; l2_pgentry_t *l2e; - l2e = map_domain_page( - pagetable_get_pfn(v->domain->arch.phys_table)); + mfn = pagetable_get_pfn(d->arch.phys_table); + + /* + * We may fail very early before direct map is built. + */ + if ( !mfn ) + return; + + l2e = map_domain_page(mfn); for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ ) { if ( l2e_get_flags(l2e[i]) & _PAGE_PRESENT ) free_domheap_page(mfn_to_page(l2e_get_pfn(l2e[i]))); } - - free_domheap_page( - mfn_to_page(pagetable_get_pfn(v->domain->arch.phys_table))); + free_domheap_page(mfn_to_page(mfn)); unmap_domain_page(l2e); - v->domain->arch.phys_table = mk_pagetable(0); + + d->arch.phys_table = mk_pagetable(0); } int __shadow_mode_enable(struct domain *d, unsigned int mode) diff --git a/xen/arch/x86/shadow_public.c b/xen/arch/x86/shadow_public.c index e87188153a..7dfe111f2f 100644 --- a/xen/arch/x86/shadow_public.c +++ b/xen/arch/x86/shadow_public.c @@ -59,12 +59,21 @@ fail: void shadow_direct_map_clean(struct vcpu *v) { + unsigned long mfn; + struct domain *d = v->domain; l2_pgentry_t *l2e; l3_pgentry_t *l3e; int i, j; - l3e = (l3_pgentry_t *)map_domain_page( - pagetable_get_pfn(v->domain->arch.phys_table)); + mfn = pagetable_get_pfn(d->arch.phys_table); + + /* + * We may fail very early before direct map is built. + */ + if ( !mfn ) + return; + + l3e = (l3_pgentry_t *)map_domain_page(mfn); for ( i = 0; i < PAE_L3_PAGETABLE_ENTRIES; i++ ) { @@ -81,12 +90,11 @@ void shadow_direct_map_clean(struct vcpu *v) free_domheap_page(mfn_to_page(l3e_get_pfn(l3e[i]))); } } - - free_domheap_page( - mfn_to_page(pagetable_get_pfn(v->domain->arch.phys_table))); + free_domheap_page(mfn_to_page(mfn)); unmap_domain_page(l3e); - v->domain->arch.phys_table = mk_pagetable(0); + + d->arch.phys_table = mk_pagetable(0); } /****************************************************************************/ -- 2.30.2